package study.nosql.redis.support.redis;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

import javax.annotation.PostConstruct;

@Slf4j
//@Component
public class JedisConfig {

    @Autowired
    private JedisConnectionFactory jedisConnectionFactory;

    @PostConstruct
    public void init() {
        GenericObjectPoolConfig poolConfig = jedisConnectionFactory.getClientConfiguration()
                .getPoolConfig()
                .get();

        //当调用return Object方法时，是否进行有效性检查
        poolConfig.setTestOnReturn(true);
        //当调用borrow Object方法时，是否进行有效性检查
        poolConfig.setTestOnBorrow(true);
        //如果为true，表示有一个idle _1_object evitor线程对idle object进行扫描，
        //如果validate失败，此object会被从pool中drop掉；这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义；默认是false
        poolConfig.setTestWhileIdle(true);

        //borrowObject返回对象时，是采用DEFAULT_LIFO（last in first out，即类似cache的最频繁使用队列），
        //如果为False，则表示FIFO队列
        poolConfig.setLifo(true);

        //（※）“空闲链接”检测的周期。如果为负值，表示不运行“检测线程”。默认为-1
        //表示idle _1_object evitcor两次扫描之间要sleep的毫秒数
        poolConfig.setTimeBetweenEvictionRunsMillis(5000);
        //（※）对于“空闲链接”检测线程而言，每次检测的链接资源的个数。默认为3
        //表示idle _1_object evictor每次扫描的最多的对象数
        poolConfig.setNumTestsPerEvictionRun(3);
        //（※）表示一个对象至少停留在idle状态的最短时间，然后才能被idle _1_object evictor扫描并驱逐；
        //这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
//        poolConfig.setMinEvictableIdleTimeMillis();
//        //（※）
//        poolConfig.setEvictorShutdownTimeoutMillis();
//        //（※）
//        poolConfig.setSoftMinEvictableIdleTimeMillis();
    }
}
